Unite2018.day3


新機能Shader Graphを使えばプログラミング無しにシェーダーが作れるようになります!

Create > Shader > ShaderGraph >  とかでサンプルが出る


右上のプロパティブラックボード、というところでプロパティを足せる。

-> それをグラフ上にD&Dでノードとして配置できる。パラメータを足せる。


具体的に作ってみる


ディゾルブ

・アルファカットアウトで

・際が光る


cutoff値よりも小さな部分を透明にする、

で、濃淡がある画像に対して行ったりすると、その形に抜けていく。

かつ、際の色を発光にする。


SampleTex2Dを作って、

石像に使われるノーマルマップをPBR Masterノードにセット

モデルは右下のほうでCustomなモデルにセットできる。


SampleNoiseを作って、MasterのAlphaに突っ込む


Vector1パラメータノードを作って、MasterのAlphaClipに突っ込む

-> この値をいじると、透明度が変わる。


閾値、Threatholdは、Stepノードを使う。

あるedge値をセットすると、流れ込んでくるものによって0か1を返す。


Stepに対してNoiseをインプット値として接続、Vector1ノードをedgeとしてセット

こうすることで、V1をedgeとしてインプット値を0か1にできる。


Timeノードを使う

ゲーム開始からの秒を返してくる

Fractionノードを使う

小数点以下を抜き出す


Time -> Fractionで反復Animationが作れる。

Fraction -> V1へと接続し、時間で変化する反復要素を組み込む。


プロバティブラックボードにカラーを新規作成し、そこからノードを作成する。


Multiplyノードを足して、カラー -> Mul -> Masterに接続すると、Untiyのプロパティからエッジのカラーをセットすることができる。


ゲージ

グラデーション素材とスレッショルドの合成で表現


・グラデーション素材を適当に作る

・Unlit Graphで作成(ライトの影響受けなくていいので

・半透明を使うので、Unlit Masterノードの設定を変更、 Opaque -> Transparent


円形ゲージに対して、中心から直線を引いてぐるりとグラデーションを回したようなグラデーションを用意する。

Tex2D

Step

V1

を用意、


V1 -> Stepのedge、

Tex2D -> Stepの値

とやって、

Remap

in(min ~ max)に入ったものを、out(min ~ max)の範囲で出力さっるよう一時変換するノード。

0 - 1で入れたものを、1-0にすることで入力を反転する。


Stepだと値がバッチリ切れてしまって、これで値を作るとテクスチャがジャギってしまう。

-> SmoothStep ノードを使って書き換え!

ゲージのエッジがいい感じに滑らかになった


ゲージの画像をmulノードで追加する。


2つの値を補完したり、アルファブレンディングするのはlerpノードを使うといい感じ。



荒ぶるテレビ

PBRシェーダ、

SampleTex2Dで対象の画像をインプット

ライトの色を黒にして無効化


Sinノード

Sin波を使って、横軸に入るしまを作ろう。


Splitノード

ベクトルを成分に分解する

ついとなるCombineノードは、A,R,G,Bなどからベクトルを作り出す。


Sin波をMulで200倍し、


Saturateノードで、-1 ~ 1のSinを、0 ~ 1に変換できる。


UVAnimationさせてみよう。

Time -> Mul -> Addを接続する。



Time -> GradientNoise -> 横にぶれるエフェクト、とやって、「ランダムな時間によってぶれる」みたいなのを実現する。



補足情報

今日の例はgithubにあるよ~~

https://github.com/keijiro/ShaderGraphExamples



CustomNodeの実装

既存のNodeを組み合わせてCustomNodeを作り出せる。なるほど。



スクリプトによるTimelineがっつり拡張入門


おさらい

・いろんなフィールドをコード無しで書き換え可能。

・パラメータさえMonoBehaviourであれば扱える。

Timeline(Playable)

PlayableDirectorComponent に入っている。


Track

Bindingしたものを扱う。

Cllipを含む

Clip

時間指定した効果



AnimationTrack

GOのパラメータをコントロールしたい時には使える。

例えばPostEffectとか、GOではないものはコントロールできない。スクリプトを書く必要がある。


次のような選択肢がある

1.AnimationTrack + MonoBehaviour

2.ControlTrack

3.CustomPlayable



1.AnimationTrack + MonoBehaviour

一番簡単、MonoBeで扱えばいい。

Updateとかでいじる。



2.ControlTrack

MonoBehaviour とITimeControl を実装する

Clipの開始、終了、再生中がわかればいい、という場合に有用。


OnControlTimeStart, SetTime(double) とかがある。

Clipの最大長は取れないので、こう、はい。事前に知っている必要がある。



3.CustomPlayable

専用トラックの定義。

Behaviour

クリップごと


Mixer

トラックごと


Mixerのほうが使いやすい。

・実時間を扱っているせいで、Behだと処理落ちで終了までのプロセス全てが動くわけではない、という可能性がある

Trackの拡張

BindingType(型)

Trackの色

TrackClipType(コンテキストメニューに現れるクリップのタイプ、複数貼るのが可能


TrackAssetを拡張、


override Playable CreateTrackMixer

Playable(今回はMixer)を生成する。


var mixer = ~して、

(この時点でmixerをこのコンテキストで保持しておくと、後からいじれるので良い、らしい。)

return mixer;


override void GatherProperties

Clipの(?)終了時にプロパティを戻す。


Mixer

トラック全てに対してイベントを発生させる。

全フレーム、Processメソッドの呼び出しが発生する。


Recordしたい、Timeline上でカーブ入れたい、、、

Clip内にBehaviourを持ち、bh内にパラメータを移動する。

Behaviour拡張はかならずSerializableをつける。

中のパラメータもpublicだったりSerializeFieldで定義する。

すると、それらは追跡できるようになる。


これらのClip内の物体は、メソッドを持たせず、全体を見通せるMixer上から編集するスタイルがいいと思う、みたいな。



さらなるスクリプト

AEからコンバートして再生!というのをやってみる。

MovieProxyPluginを使って、連番アニメーション限定、なるほど!!


あとでデータ見てみよ。



運営中コンテンツにおける大型アップデート成功のための考え方とUnity最適化手法

話題の大半が、ひたすら実践的かつ、「えっそれを決断してやれる組織あるんすか、、マジすか、、」みたいな顔になることが多かった。

シェーダ、グラフィックを大幅更新した話

リム、スペキュラ、環境マップは、キャラクターものを作る上で絵がダイレクトに影響を受けやすく、効果が高かった。

パラメータテクスチャを用意、テクスチャを用意してRGBで強度を調整する、という感じにした。

Unityの法線は1つしか持てない -> FBXからインポートすることもできない。

で、FBXを2つ作って、2つの法線をもつ -> 自前インポータを書いて2つの法線を持つデータにする!と。


CGFXをMayaとUnityで共有することで、プレビューを可能にした

すごーい!



Androidでのテクスチャのバンディング対策

ETC2 Normal使うと、0.5秒の圧縮時間と、バンドが出ない映像が得られることがわかった。

ETC2もっと早く使わなかった理由は?

・騎手が対応しているかどうかの判別手段がなかった

・ないところで使うと6倍のメモリをああああ

・Unityのバグもあった



並列AssetBundleビルド

manifestファイルさえあればそのビルドは発生しない(!)という特性を使い、

特定の単位でビルド対象を切って、manifestを共有していけば、新規や更新があった部分だけが作成される。

-> これめっちゃ素敵なのでパクろうと思う。

Unityキャッシュサーバ高速化

キャッシュのサイズを500GBにして対応、30分 -> 7分 とかになった。MacProを使った。



まとめの近所

まとめで、「誰が作ったものにもバグはあります、もちろんUnityにも。でもやっていきましょう」みたいな話があって、

ひたすらうなづいていた。



『CARAVAN STORIES』のアセットバンドル事例

めちゃくちゃ綺麗な絵の素敵なゲーム。


正規表現を駆使してResources -> AssetBundle ,,みたいな探索

これって開発中のみ?

->常に実用

すごいパワフル、、Resourcesのラッパ作ってそこでだけ行えばいいのでは感があるけど、ものすごい機構。



Unloadのくだり

2秒で自動unloadしてる

メモリに保持しておくのが惜しいのか~。なるほど。

それであれば、辞書を作ってそこにInstantiateしたのを持っておけば、即解放しちゃっていいのでは?

-> ABManagerがそんな感じの実装を持っているらしい。


ただ、音データとかをコピーなしで鳴らしていると、Unloadしたときに同時に消えちゃうはずで、確かにそんな感じになったというのが発表にあった。


variantのくだり

使わないほうがいい、Yes。ほんとにそれ。



AssetBundleNameを使ってると困るところがある

-> タイミング的に、Unityの負荷が高いところで使うとよく失敗してた気がする。

-> 後続のverでは滅びていた気がする。AssetGraphとかである程度できると思うけれど。



IDCFのCDNだと問題が出る

別にAWSでも発生するんでは、みたいな。クエリつけようねみたいな話だった。



スクリプタブルレンダーパイプライン入門

いろんなゲームのレベルがあるよね


Motivation

Unityのレンダリングをblackboxにしたくない、

カスタマイズの自由を提供したい。

APIs

Built-In Render Pipeline(will be dep)

既存


Lightweight(beta)

MobileとXR向け、一つの光源、


HighDefinition(preview)

ハイエンドPC向け


Custom

カスタム!!



どこから始めようか

Tips:ライトを切るとBatchやTrisがすごく減る

SRPの使い始め。


新規プロジェクト作成 > 作成ウィンドウでLWRPとかを選択したり、packageManagerから最新版をロードできる。

スクリーンショット 2018-05-09 17.03.12.png

これらはLWRPのHigh,Middle, Lowとか。あとPostProessingがついてくる。

LWRPはそれぞれ設定の重量が違う状態のAsset(ScriptableRenderPipelineアセット)

このAssetを、

Project Settings > Graphics > 

スクリーンショット 2018-05-09 16.51.14.png


GraphicsSettingsのところに適当なLWRPAssetをセットすると、画面に対するパイプラインが変更される。

スクリーンショット 2018-05-09 16.51.26.png


LWRPでのライト

メイン一個のみがサポートされている。

パフォーマンスよさげ。


Rendering設定 > PixelLight でPixelLightの数を調整できる。

これらのライトは影を落とさない。ので、描画計算に影響を与えない。

最大8。

スクリーンショット 2018-05-09 17.03.18.png



DebugWindow

実行時に描画オプションをいじれる、、らしいがよくわからんかった。今度講演資料みよう。



CustomRenderPipelineについて

参考になるものといえば!みたいな話題


けいじろうさんのRetro3DPipeline

https://github.com/keijiro/Retro3DPipeline


あとgithubでScriptabkeRenderPipeline自体が公開されている。

https://github.com/Unity-Technologies/ScriptableRenderPipeline




そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説

・ScriptableBuildPipelineで、ビルド時などのサポートができる。すべてC#製。

・previewがリリースされている。0.0.22-preview

・エディタでのPlay時にABの更新をやってくれる


AssetReference

prefabみたいなもの。参照になるので、打ち間違いとかはない。



読み出し方

・AssetReferenceオブジェクトをインスペクタからセットしたりする。

・annotationでの型、ラベル(by Addressablesツール)指定で、扱うAssetの指定を行うことが可能。

・参照カウント方式なんで、消すときはReleaseを行う。

たぶん無視して種類全消しとかもできるのでは?


・同じロジックのままでDL元を変更できる。

・どこから取得するか、というのを、グループという単位で指定できる。

1.Local

2.Remote

3.Advanced


・ContentsCatalog、という全てのアドレス、ラベル、グループの情報が入ったファイルを生成する。json。

・ラベルによる事前ロードを行うことができる。

AutoyaでいうPreload。これ動的に生成できないかな、、

特定のラベルがついているAssetをすべて取得することができる。素晴らしい。


・Profile 設定集

Devとか切り替えるよね、ってやつ。素晴らしい。変数の列挙。


・PlayMode 設定

開発の状況に合わせてデータのロード方法を一括変更するパイプライン処理が選べる。

1.Fast(デフォルト、AssetDatabaseを見に行く

2.Virtual(ABに似せたロード経路を使う

3.Packed(ABを使う


・ResourceManagerProfiler

現在ロードされているResourceの情報が把握できる。



AddressableAssetsの役割

起動時処理でグループ設定情報をロード、カタログをロードして、というのをコードでやる。

任意のタイミングでキックできるかな?



ResourceManager

参照関連、寿命の管理を行う。

AsyncOpを返してくるので、ユーザー側で頑張る。


文字列、AssetReferenceを渡すと云々。


カスタマイズ

だいたいすべてのパーツが改造できそう。


たとえばリストであれば、ResLocator、ResProvicerをカスタマイズすればよさげ。


こういったカスタマイズは全て初期化時にセットするんかな。



Q&A

カタログをサーバ側で生json生成してかえしたい(ResLocatorとかをカスタマイズ?

-> カスタマイズできるよ!


カタログに独自値を加えたい、、!(verとかnameとか

-> カスタマイズできるよ!


複数のカタログを扱いたい(管理が楽(見た目関連、データ関連とか

-> appendという形でやるつもりらしい


カタログを更新するタイミングはユーザー定義でいつでもできる?

-> resLocMapをダイレクトに書き換えることで実現できるが、標準ではない


すでにAB使ってるタイミングでそのABを更新した内容のカタログを獲得したらどうなる?

-> 自作

カスタマイズは全て初期化時にセットする?

-> それ

特定のAssetRefの参照カウントを取得することはできる?

-> ない


ReleaseByAssetRef、とかで、特定のAssetRefを元にしてるassetsを一掃できる?

参照カウント管理は自分でやる、が、その機能は面白いんでお話。


RMのエラーハンドリングどうなってる感じ、isErrorみたいなのをやる?

-> いまのところ自作

カタログ更新によって使わなくなったABをどう扱うか

-> いまのところ自作


Preloadの並列数っていじれます?

-> 今はない、おもしろいと思うんでお話。


Preloadに使う引数を外部で生成することは受け付けられる?

ラベルは文字列なんでいける!


感想

紹介のされかた的に、「新しいUnityの仕組み」なのかな=~と思っていたが、実際にはこれはフレームワークなんだな~という理解になった。

・デフォルトかつ固定のフローが存在する。

・複数のパーツから構成され、パーツを自作することでフローに乗ったまま動作を変えられる


うん、これはフレームワークだ。


実際すべてUnity外のC#コードで書かれている、ということで、ほとんどAutoya(自作してるフレームワーク)と同じユースケースを果たせるような予感。

↑のQ&Aで聞いてた部分で、自分でやる、や、今後つくかも、といった部分に関して、Autoyaには含まれていてAddressableにはまだ、という状況なので、


今後めっちゃ使える形になってリリースされるのが待ち遠しい。